package com.hyper_yang.javase.collections.list_collection;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

public class List_traverse {
    // List 继承 Collection（通用遍历: 迭代器、增强 for循环、lambda表达式）
    // 特有: 列表迭代器、普通for循环(index)
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        System.out.println(list);

        // Iterator 迭代器
//        Iterator<String> iterator = list.iterator();
//        while (iterator.hasNext()){
//            String next = iterator.next();
//            System.out.println(next);
//        }

        // 增强 for
//        for(String s : list){
//            System.out.println(s);
//        }

        // lambda
//        list.forEach(s -> System.out.println(s));

        // for  size()、get()
//        for (int i = 0; i < list.size(); i++) {
//            String s = list.get(i);
//            System.out.println(s);
//        }

        // 列表迭代器
        // 获取列表迭代器对象，里面的指针默认指向 0索引
        // 引入额外方法 add()、hasPrevious()、previous()
        ListIterator<String> iterator = list.listIterator();
        while (iterator.hasNext()) {
            String next = iterator.next();
            if("b".equals(next)){
                iterator.set("bbb"); // set() 在遍历过程中可以替换元素
                iterator.add("QQ"); // add() 在遍历过程中可以添加元素
                // add()、set() 互换 throw IllegalStateException
//                IllegalStateException是因为违反了ListIterator的调用顺序：
//                add("QQ")方法会向列表插入元素，导致迭代器状态发生变化（游标位置后移）。
//                紧接着调用set("bbb")时，迭代器无法确定当前要修改的是哪个元素（next()返回的元素位置已被add()改变），从而抛出异常。
//                关键规则：
//                set()必须直接跟在next()或previous()之后调用。
//                add()或remove()操作会重置迭代器的“最后一次操作记录”，导致后续set()无法定位元素。
            }
        }
        System.out.println(list);
    }
}
